#ifndef TASKCONVERT_H_
#define TASKCONVERT_H_

//boost headers
#include <boost/thread.hpp>

//std headers
#include <string>

//project headers
#include "ITask.h"
#include "../ConvertorManager.h"
#include "../Psqldb/IDatabase.h"
#include "../Server/SRVConnection.h"
#include <DataContainer.h>


namespace Tasks{

	//! Trieda TaskConverter
	/*!
		Sluzi na realizaciu konverzie. Trieda dedi od generickej triedy
		ITask ktoru zaroven specializuje na pracu s datovym typom
		DataContainer.
		Trieda TaskConverter je thread-ovo bezpecna!
	*/
	class TaskConvert : public ITask<Data>
	{
		public:
			//! TaskConvert (Konstruktor)
			/*!
				Inicializuje ulohu konverzie dokumentov. Na inicializaciu
				je potrebne mat aktivne spojenie s databazou a na spravnu
				funkcnost nahraty aspon jeden konverzny plugin.
				\param DB::IDatabase * theDBConnection smernik na aktivne spojenie
				\param ConvertorManager * theConvertorsMgr smernik na manager pluginov
				\return 
			*/
			TaskConvert(DB::IDatabase *ptheDBConnection,ConvertorManager *ptheConvertorsMgr);

			
			//! TaskConvert (Konstruktor)
			/*!
				Pretazena verzia o moznost posielania info pre klienta
				\param DB::IDatabase * ptheDBConnection
				\param ConvertorManager * ptheConvertorsMgr
				\return 
			*/
			TaskConvert(DB::IDatabase *ptheDBConnection,ConvertorManager *ptheConvertorsMgr,std::string theClientAddress,std::string theClientPort);

			//! operator() (spracovanie ulohy)
			/*!
				Zavolanim operatora () sa aktivuje uloha konverzie ktora 
				\return void
			*/
			virtual void operator()();

		private:
			//////////////////////////////////////////////////////////////////////////
			//							MEMBER VARIABLES							//
			//////////////////////////////////////////////////////////////////////////
			ConvertorManager *my_pConvertorMgr;
			DB::IDatabase *my_pDBConnection;
			boost::mutex myMutex;

			std::string myClientAddress;
			std::string myClientPort;


			//////////////////////////////////////////////////////////////////////////
			//							MEMBER FUNCTIONS							//
			//////////////////////////////////////////////////////////////////////////
			std::string get_date(void);
			void send_pk(void);
			void kill_newlines(std::wstring &input);

	};

}

#endif